"""
当用户登陆时,将redis和cookie数据进行合并
"""""
from django_redis import get_redis_connection
import pickle
import base64


def merge_cookie_to_redis(request,user,response):
    """
    合并 规则是什么,如何合并
    cookie数据类型:{sku_id:{'count':xxx,'selected':xxx}}
                {2:{'count':8,'selected':true}}  {4:{'count':3,'selected':false}}

    redis: {sku_id:count}

    1.以cookie为准,redis数据全部删掉
    2.以redis数据为准,如果cookie中含有redis中没有的商品id,则将这个商品id添加到redis中
    3.如果cookie中有redis的商品,合并的时候,以cookie数据为准


    # 1.先获取cookie里面的数据
    # 2.再获取旧的redis里面的数据
    # 3.对cookie里面的数据进行遍历,将新的数据添加到redis中
    # 4.将新的redis数据局保存在redis数据

    """
    # 1.先获取cookie里面的数据
    cookie_str = request.COOKIES.get('cart')
    if cookie_str is not None:
        cookie_cart = pickle.loads(base64.b64decode(cookie_str))

        # 2.再获取旧的redis里面的数据
        #　连接redis
        redis_conn = get_redis_connection('cart')

        # 获取数据
        redis_cart = redis_conn.hgetall('cart_%s'%user.id)
        # {b'sku_id:b'count}

        redis_selected_ids = redis_conn.smembers('cart_selected_%s'%user.id)

        # 得到的redis数据是一个bytes类型,我们需要将其转换

        cart = {}
        for sku_id,count in redis_cart.items():
            cart[int(sku_id)] = cart[int(count)]

        ids_list = []

        for sku_id in redis_selected_ids:
            ids_list.append(int(sku_id))



        # 3.对cookie里面的数据进行遍历,将新的数据添加到redis中
        # cookie:{sku_id:{'count':xxx,'selected':xxx}}
        # cart: {sku_id:count,sku_id:count}
        for sku_id,count_selected_dict in cookie_cart.items():

            # 以redis数据为准, 如果cookie中含有redis中没有的商品id, 则将这个商品id添加到redis中
            cart[sku_id] = count_selected_dict['count']

            # 如果cookie中有redis的商品, 合并的时候, 以cookie数据为准,根据字典特点,有覆盖,没有添加
            # cart[sku_id] = count_selected_dict['count']

            # 选中状态

            if count_selected_dict['selected']:
                ids_list.append(sku_id)

        # 4.将新的redis数据局保存在redis数据

        redis_conn.hmset('cart_%s'%user.id,cart)

        # *list 解包
        redis_conn.sadd('cart_selected_%s'%user.id,*ids_list)

        #原来的cookie数据进行清除
        response.delete_cookie('cart')

        return response
    else:
        return response



    pass